/**
 * 解决各方法之间的耦合
 */
var Observe = (function() {
    // 防止消息队列暴露而将篡改故将消息容器作为静态私有变量保存
    var _messages = {};
    return {
        // 注册信息接口
        regist: function(type, fn) {
            if (typeof _messages[type] === 'undefined') {
                _messages[type] = [fn];
            } else {
                _messages[type].push(fn);
            }
        },
        // 发布信息接口
        fire: function(type, args) {
            if (!_messages[type]) return;
            // 定义消息信息
            var events = {
                type: type,                 //消息类型
                args: args || {}            //消息携带数据
            },
            i = 0,                          //消息动作循环变量
            len = _messages[type].length;   //消息动作长度
            for(; i < len; i++) {
                _messages[type][i].call(this, events);
            }
        },
        // 移除信息接口
        remove: function(type, fn) {
            // 如果消息动作队列存在
            if(_messages[type] instanceof Array) {
                // 从最后一个消息动作遍历
                var i = _messages[type].length - 1;
                for(; i >= 0; i--) {
                    // 如果存在该动作则在消息动作序列中移除相应动作
                    _messages[type][i] === fn && _messages[type].splice(i, 1);
                }
            }
        }
    };
})();

// 外观模式 简化获取元素
function $(id) {
    return document.getElementById(id);
}

// A写的方法
(function() {
    function addMsgItem(e) {
        var text = e.args.text,                     //获取消息中用户添加的文本内容
            ul = $('msg'),                          //留言容器元素
            li = document.createElement('li'),      //创建内容容器元素
            span = document.createElement('span');  //删除按钮
        li.innerHTML = text;                        //写入评论
        span.onclick = function() {
            ul.removeChild(li);                     //移除留言
            // 发布删除留言消息
            Observe.fire('removeCommentMessage', {
                num: -1
            });
        }
        li.appendChild(span);
        ul.appendChild(li);
    }
    Observe.regist('addCommentMessage', addMsgItem);
})();

// B写的方法
(function() {
    function changeMsgNum(e) {
        var num = e.args.num;
        $('msg_num').innerHTML = parseInt($('msg_num').innerHTML) + num;
    }
    Observe
        .regist('addCommentMessage', changeMsgNum)
        .regist('removeCommentMessage', changeMsgNum);
})();

// C写的方法
(function() {
    $('user_submit').onclick = function() {
        var text = $('user_input');
        if (text.value === '') {
            return;
        }
        Observe.fire('addCommentMessage', {
            text: text.value,
            num: 1
        });
        text.value = '';
    }
})();
